/*
 *  WilEventUtils.h
 *  Wilson
 *
 *  Created by Sebastian Orfino on 9/6/11.
 *  Copyright 2011 __MyCompanyName__. All rights reserved.
 *
 */

#ifndef __WILEVENTUTILS__
#define __WILEVENTUTILS__

//project includes
#include "Event/Event.h"
#include <boost/circular_buffer.hpp>
//stl includes
#include <boost/shared_ptr.hpp>
#include "evento_csxs_base.h"

namespace wilson {
	
	class handler_functor;
	
		
	/** una operacion que implica varias idas y venidas de eventos entre el plugin y alguna extension 
	 Las conversaciones solo pueden ejecutarse mediante un iniciador. El iniciador se obtiene llamando a 
	 conversaciones::preparar_nueva()*/
	class conversacion  {
		
	protected:
		friend class iniciador;
		
		/** entry point de la conversacion */
		virtual void main() { ASSERT("Esto debe implementarse"); };
		
	};
	
	typedef boost::shared_ptr<conversacion> conversacion_ptr;
	
	/** para arrancar una conversacion */
	class iniciador { 
		
		conversacion_ptr c;
		
	public:
		iniciador(const iniciador& otro) : c(otro.c) {}
		
		iniciador(const conversacion_ptr& _c): c(_c) {}
		
		/** inicia la conversacion */
		void iniciar() { c->main(); }
	};
	
	
	namespace conversaciones  {
	   
		#define MAX_CONVERSACIONES 10
		
		/** prepara una nueva conversacion para ejecutarse. Solo pueden haber MAX_CONVERSACIONES al mimso tiempo.*/
		iniciador preparar_nueva(const conversacion_ptr& c);
	
	};
	
	namespace extensiones  {
		
		/** activa una extension (la carga y le da el foco) */
		void activar(const char* ext_id);
	}
	
			
	csxs::event::EventErrorCode despachar(const eventos::evento_csxs_base&);
	csxs::event::EventErrorCode escuchar(const char *evt, handler_functor *) ;
	csxs::event::EventErrorCode olvidar(const char *evt, handler_functor *) ;


}


#endif //__WILEVENTUTILS__